package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Collection集合下  子集合【叫队列】  包位置：java.util
 *  Queue  队列  单端队列
 *  Deque  队列  双端队列  "Deque接口---继承--Queue接口"
 *  作用：保存数据，有序储存和处理，功能：数据缓冲或者多线程协调工作！
 *
 *  队列实现类：
 *  LinkedList：双向链表
 */
public class QueueAPI {
    //Queue  队列  单端队列
    @Test
    public void testQueue() {
        //创建队列--多态--LinkedList
        Queue<String> queue = new LinkedList<>();
        /**
         * offer() ---add（）一样
         * 作用：入队操作，队尾追加元素
         */
        queue.offer("毒");
        queue.offer("微笑花");
        queue.offer("凌白热");
        queue.offer("hot");
        System.out.println("Queue队列：" + queue);
        /**
         * poll()   返回值：E
         * 作用：出队操作，获取队首元素，并且删除队列中元素
         * peek()   返回值：E
         * 作用：出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll();
        System.out.println("Queue队列：" + queue);
        String str = queue.peek();
        System.out.println("队首元素：" + str);
        System.out.println("Queue队列：" + queue);

        /**
         * 需求：1.遍历队列---while---只遍历一次队列【队列元素消失】
         *      提示：while条件：拿到队列中总长度 size（）>0
         * 需求：2.遍历队列---增强for---队列元素不消失
         *      提示：for条件：E e:队列
         */
        for (String e : queue) {
            System.out.println("队列元素:" + e);
        }


        //while (queue.size()>0){//true：队列总数>0 队列有元素 遍历
        //     str=queue.poll();//获取队首、删除队列中队首
        //    System.out.println("获取队列元素："+str);
        // }
        System.out.println("queue队列元素" + queue);
    }

    //Deque 队列  双端队列--继承--单端队列
    @Test
    public void testDeque() {
        //创建Deque 双端队列 方法基本一致，部分方法不一致
        Deque<String> deque = new LinkedList<>();
        deque.offer("五条悟");
        deque.offer("伏黑惠");
        deque.offer("虎杖悠仁");
        deque.offer("狗卷棘");
        System.out.println("双端队列：" + deque);
        //offerFirst（） 队首添加元素  OfferLast（）队尾添加元素
        deque.offerFirst("赤苇京治");
        deque.offerLast("木兔光太郎");
        System.out.println("双端队列【首尾添加元素】：" + deque);
        //getFirst（）获取队首  getLast（）获取队尾
        System.out.println("获取队列中队首：" + deque.getFirst());
        System.out.println("获取队列中队尾：" + deque.getLast());
        //pollFirst（）获取队首，删除队列中队首 【单端：poll类似】
        //pollLast（）获取队尾，删除队列中队尾
        String mu = deque.pollLast();//删赤苇京治元素  队列--队首
        System.out.println("队尾元素：" + mu);
        System.out.println("双端队列：" + deque);
    }

    @Test
    public void testStack() {
        //创建双端队列--支持栈结构
        Deque<String> stack = new LinkedList<>();
        /**
         * push() deque 独有方法--支持栈结构
         * ---offer：Queue--add：Collection接口 【添加】
         * 作用：【添加：往栈压入一个元素】 压栈操作
         */
        stack.push("日向翔阳");
        stack.push("影山飞雄");
        stack.push("及川彻");
        stack.push("孤爪研磨");
        /**
         * pop() 出栈一个尾元素---pollLast类似
         */
        String last = stack.pop();
        System.out.println("出栈尾元素：" + last);
        System.out.println("栈结构：" + stack);
        /**
         * 面试题：pop poll peek的使用区别
         * 需求1：遍历栈结构---while--元素出栈，队列元素需要清空
         * 需求2：遍历栈结构---增强for--元素遍历成功，队列元素不变
         */

        for(String a:stack) {
            System.out.println(a);
        }
        System.out.println(stack);
        while(stack.size()>0) {
            String y=stack.pop();
            System.out.println("出栈"+y);
    }
    }

}


